package cn.life.common.entity.vo;

import java.util.List;

/**
 * 记录分页类，定义分页相关方法
 *
 * @param <T> 行集中元素类型
 */
public class Pagination<T> {

    /**
     * 缺省每页显示的记录数
     */
    public static final int DEFAULT_PAGE_SIZE = 20;

    private int total = 0; // 总记录数
    private int pageIndex = 0; // 当前页索引
    private int pageSize = DEFAULT_PAGE_SIZE; // 每页显示的记录数

    private boolean success = false;
    private List<T> rows = null; // 记录信息

    /**
     * 获取分页记录是否成功
     *
     * @return 分页记录成功返回true，否则返回false
     */
    public boolean getSuccess() {
        return this.success;
    }

    /**
     * 设置分页记录是否成功
     *
     * @param success 是否成功
     */
    public void setSuccess(boolean success) {
        this.success = success;
    }

    /**
     * 获取分页行集
     *
     * @return 分页行集
     */
    public List<T> getRows() {
        return this.rows;
    }

    /**
     * 设置分页行集
     *
     * @param rows 分页行集
     */
    public void setRows(List<T> rows) {
        this.rows = rows;
    }

    /**
     * 获取总记录数
     *
     * @return 总记录数
     */
    public int getTotal() {
        return this.total;
    }

    /**
     * 设置总记录数
     *
     * @param total 总记录数
     */
    public void setTotal(int total) {
        reset(total, pageIndex, pageSize);
    }

    /**
     * 获取当前页码
     *
     * @return 当前页码
     */
    public int getPageIndex() {
        return this.pageIndex;
    }

    /**
     * 设置当前页码，最小页码0
     *
     * @param pageIndex 当前页码
     */
    public void setPageIndex(int pageIndex) {
        reset(total, pageIndex, pageSize);
    }

    /**
     * 获取页大小
     *
     * @return 页大小
     */
    public int getPageSize() {
        return this.pageSize;
    }

    /**
     * 设置页大小
     *
     * @param pageSize 页大小
     */
    public void setPageSize(int pageSize) {
        reset(total, pageIndex, pageSize);
    }

    public Pagination() {
    }

    public Pagination(int total) {
        reset(total, pageIndex, pageSize);
    }

    public Pagination(int total, int pageIndex) {
        reset(total, pageIndex, pageSize);
    }

    /**
     * 封装分页信息操作的构造器
     *
     * @param total     总记录数
     * @param pageIndex 当前页
     * @param pageSize  每页显示的记录数
     */
    public Pagination(int total, int pageIndex, int pageSize) {
        reset(total, pageIndex, pageSize);
    }

    /**
     * 获取总页数
     *
     * @return 总页数
     */
    public int getTotalPage() {
        int totalPage = total / pageSize;
        return (total % pageSize == 0) ? totalPage : (totalPage + 1);
    }

    /**
     * 获取起始记录行号，最小行号1
     *
     * @return 起始记录行号
     */
    public int getRowFrom() {
        return pageIndex * pageSize;
    }

    /**
     * 获取结束记录行号
     *
     * @return 结束记录行号
     */
    public int getRowTo() {
        int rowTo = (pageIndex + 1) * pageSize;
        if (rowTo >= total) {
            rowTo = total;
            int rowFrom = getRowFrom();
            if (rowTo < rowFrom) {
                rowTo = rowFrom;
            }
        }
        return rowTo;
    }

    /**
     * 获取第一页
     *
     * @return 第一页
     */
    public int getFirstPage() {
        return 0;
    }

    /**
     * 获取最后页
     *
     * @return 最后页
     */
    public int getLastPage() {
        return getTotalPage();
    }

    /**
     * 获取前一页
     *
     * @return 前一页
     */
    public int getPrevPage() {
        return canPrevPage() ? (pageIndex - 1) : 0;
    }

    /**
     * 获取后一页
     *
     * @return 后一页
     */
    public int getNextPage() {
        return canNextPage() ? (pageIndex + 1) : getTotalPage();
    }

    /**
     * 判断‘首页’及‘前页’是否可用
     *
     * @return ‘首页’及‘前页’是否可用
     */
    public boolean canPrevPage() {
        return (pageIndex > 0);
    }

    /**
     * 判断‘尾页’及‘下页’是否可用
     *
     * @return ‘尾页’及‘下页’是否可用
     */
    public boolean canNextPage() {
        return (pageIndex < getTotalPage());
    }

    /**
     * 重置分页属性
     *
     * @param total     记录总数
     * @param pageIndex 页码
     * @param pageSize  页大小
     */
    public void reset(int total, int pageIndex, int pageSize) {
        if (total < 0)
            total = 0;
        this.total = total;

        if (pageSize < 1)
            pageSize = 1;
        this.pageSize = pageSize;

        int totalPage = getTotalPage();
        if (pageIndex <= 0)
            pageIndex = 0;
        else if (pageIndex > totalPage)
            pageIndex = totalPage;
        this.pageIndex = pageIndex;
    }
}
